# coding=utf-8
from rest_framework.generics import CreateAPIView, GenericAPIView
from erp_system.models import UserModel
from rest_framework import mixins
from erp_system.serializer.user_serializer import UserRegisterSerializer
from MSB_ERP.utils.base_views import MultipleDestoryMixin
from rest_framework.viewsets import GenericViewSet
from MSB_ERP.utils.pagination import GlobalPagination
from MSB_ERP.apps.erp_system.serializer.user_serializer import UserUpdateOrDeleteSerializer
from MSB_ERP.apps.erp_system.serializer.user_serializer import UserGetSerializer
from MSB_ERP.apps.erp_system.serializer.user_serializer import ResetPasswordSerializer


# 这个函数是只做新增处理的
class RegisterView(CreateAPIView):
    '''
    create:
    注册用户

    参数：username，password 必须传递的，phone和real_name可选参数，return：添加之后的user对象
    '''
    queryset = UserModel.objects.all()
    serializer_class = UserRegisterSerializer


# 当前视图类，除了用户注册，和密码修改之外，其他所有用户管理操作
class UserView(mixins.ListModelMixin, # 查询用户
               mixins.UpdateModelMixin,  # 做用户的修改
               mixins.RetrieveModelMixin,  # 单个查询
               mixins.DestroyModelMixin,  # 删除
               MultipleDestoryMixin,  # 批量删除
               GenericViewSet  # 最后要继承的（这里用的是视图集，所以用GenericViewSet）
               ):
    '''
        destroy:
        用户--删除

        用户删除，status：204（成功），return：None

        Multiple_delete:
        用户--批量删除

        partial_update:
        用户--局部修改，只是修改用户的角色和用户所在的部门，还包括用户的手机号码和真实姓名

        用户修改，status：200（成功），return：修改后的角色信息

        update:
        用户--修改，只是修改用户的角色和用户所在的部门，还包括用户的手机号码和真实姓名

        用户修改，status：200（成功），return：修改后的角色信息

        retrieve:
        查询某一个用户

        list:
        查询用户列表
    '''

    queryset = UserModel.objects.all()
    serializer_class = ResetPasswordSerializer # 序列化器
    pagination_class = GlobalPagination  # 分页显示的数据

    def get_serializer_class(self):
        # 判断访问的函数是是什么
        # 如果是修改个删除的操作，使用统一的序列化
        if self.action == 'partial_update' or self.action == 'update' or self.action == 'destroy':
            return UserUpdateOrDeleteSerializer
        else:
            return UserGetSerializer

class ResetPasswordView(
    mixins.UpdateModelMixin, # 做密码的修改
    GenericAPIView # 这里用的是视图函数，所以用GenericAPIView
    ):
    '''
        patch:
        用户--修改密码，需要输入原始密码，新密码和密码的确认

        用户修改密码，status：200（成功），return：修改之后的用户，但不显示密码
    '''
    queryset = UserModel.objects.all()
    serializer_class = ResetPasswordSerializer

    def patch(self,request,*args,**kwargs): # 重写局部修改函数
        # 他最终调用的是我们自己写的save
        # 一开始会调用partial_update，然后在调用父类的update，然后在调用perform_update，然后在serializer.save，然后就会回去我们自己写的save里面去
        return self.partial_update(request,*args,**kwargs)




